package com.haojin.spring.aop.example;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author .29.
 * @create 2023-02-04 22:05
 */
public class ProxyFactory {
    //目标对象
    private Object target;

    public ProxyFactory(Object target){
        this.target = target;
    }

    //返回代理对象
    public Object getProxy(){
        //动态代理返回对象
        //调用Proxy类中的newProxyInstance(),获取动态代理对象
        /*
        * newProxyInstance()中需要传入三个参数
        * ① ClassLoader：加载动态生成代理类的 类加载器
        * ② Class[] interfaces： 目标对象实现的所有接口
        * ③ InvocationHandler: 设置代理对象实现目标对象方法的过程
        * */
        ClassLoader classLoader = target.getClass().getClassLoader();

        Class<?>[] interfaces = target.getClass().getInterfaces();

        InvocationHandler invocationHandler = new InvocationHandler(){
            //参数一：代理对象
            //参数二：需要重写目标对象的方法
            //参数三：method方法（参数二）中的参数
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //方法调用前输出的日志
                System.out.println("[动态代理][日志]"+method.getName()+",参数："+ Arrays.toString(args));

                //调用目标方法
                Object result = method.invoke(target, args);

                //方法调用后输出的日志
                System.out.println("[动态代理][日志]"+method.getName()+",结果："+ result);
                return result;
            }
        };
        //调用Proxy类中的newProxyInstance(),获取动态代理对象
         return Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);
    }
}
